﻿/************************************************************************
 * SMLib - State Model Library
 * Copyright (C) 2012-2013 Ali Khalili (khalili_DOT_ir_@SIGN_gmail_DOT_com)
 * **********************************************************************
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU Lesser General Public License (LGPL) published 
 * by the Free Software Foundation; either version 2.1 of the License, or (at your
 * option) any later version. This program is distributed without any
 * warranty. See the GNU Lesser General Public License for more details. 
 * ***********************************************************************
 * File         :     SMLib\Automata\MM\IBlackBox_MealyMachine.cs
 * Description  :     Provides a simple general interface for black box Mealy machine (Real SULs, Emulators, rtc.)
 *                    In fact, the mapper/adaptor/test driver should take the responsibility of this interface
 *                    [for online/active systems: a system is active and we can guide the system step by step]
 *                    It would be used by realistic oracles which use model based testing techniques for their goal
 * Change log   :     -3 Feb 2013:  First version
 * To Do        :     -one step more is batch oracle!
 *                    -[To do:rename it to IBlackBox_MealyMachine_Active]
 ************************************************************************/
using System;
using System.Collections.Generic;
using SMLib.Automata.Base;

namespace SMLib.Automata.MM
{
    /// <summary>
    /// An interface/wrapper for a -stepable- black box Mealy Machine system: 
	/// it could be a SUL, an emulator, etc.
    /// </summary>
    public interface IBlackBox_MM
    {
        /// <summary>
        /// Reset the system to the initial state
        /// </summary>
        void Reset();

        /// <summary>
        /// Do one step
        /// </summary>
        /// <param name="input">input of the system</param>
        /// <returns>the corresponding output</returns>
        ISymbol Step(ISymbol input);

        /// <summary>
        /// The input alphabet of the black box system
        /// [usually, we just need the input alphabet and not output alphabet]
        /// </summary>
        Alphabet InputAlphabet
        {
            get;
        }
    }


    
}
